//
//  TSZHomeMircoblogModel.swift
//  微博天下
//
//  Created by Tsz on 15/10/13.
//  Copyright © 2015年 Tsz. All rights reserved.

import UIKit
import SDWebImage

/// 当前用户关注微博模型  ，在这个微博中存在一个用户的数组 user
class TSZHomeMircoblogModel: NSObject {
    ///微博创建时间
    var created_at: String?
    /**
    * 微博ID
    */
    var id :Int = 0
    /**
    * 微博信息内容
    */
    var text: String?
    /**
    * 微博信息内容
    */
    var source:String? {
        didSet {
            source = source?.hrefLink().text
        }
    }
    /**
    * 微博配图  ,问题是 字典里面是  pic_ids  ??????
    */
    var pic_urls:[[String : AnyObject]]?{
        didSet{
            //判断数组中是否有数据
          if  pic_urls!.count == 0 {
                return
            }
            //实例化数据进行存储
            storePictureURLs = [NSURL]()
            
            storeLargPicture =  [NSURL]()
            //遍历生成URL 数组
            for dict in pic_urls! {
                //判断如果是thumbnail_pic ，缩略图片地址，没有时不返回此字段
                if let urlString = dict["thumbnail_pic"] as? String {
                    storePictureURLs?.append(NSURL(string: urlString)!)
                    
                    let largeURLString = urlString.stringByReplacingOccurrencesOfString("thumbnail", withString: "large")
                    
                    storeLargPicture?.append(NSURL(string: largeURLString)!)
                }
            }
        }
    }
    
    //保存配图的URL的数组
    private var storePictureURLs: [NSURL]?
    
    //MARK:用户的大图
    private var storeLargPicture: [NSURL]?
    /// 用户
    var user: TSZUSerModel?
    
    //图片的路径
    var pictureURLs: [NSURL]? {
        return retweeted_status == nil ?storePictureURLs:retweeted_status?.storePictureURLs
    }
 /// 返回大图的URL
    var largePictureURLs: [NSURL]? {
        return retweeted_status == nil ? storeLargPicture : retweeted_status?.storeLargPicture
    }
    
    /// 显示微博所需要的行高
    var rowHeight: CGFloat?
    
    /// 转发微博的模型  ， 如何区分 显示的微博是转发微博还是原创微博，
    var retweeted_status: TSZHomeMircoblogModel?
    
    /**
    * 在网上去加载微博的数据 ,把一个闭包作为函数的参数
    */
    class func loadHomeMricoblog(since_id: Int, max_id: Int,  finised: (dataList: [TSZHomeMircoblogModel]? ,error:NSError?) ->()){
        
            //尾随闭包
        TSZStatusDAL.loadStatus(since_id, max_id: max_id) { (result, error) -> () in
            
            if error != nil {
                finised(dataList: nil, error: error)
                return
            }
            //判断是否获得字典数组「」
            if let array = result {
                var list = [TSZHomeMircoblogModel]()
                
                for dict in array {
                    list.append(TSZHomeMircoblogModel(dict: dict))
                }
                //缓存图片
                self.cacheStatusPictures(list, finished: finised)
            }else {
                finised(dataList: nil, error: nil)
            }
            
        }
    }
    //实现图片缓存,因为一张图片的话使用固定的大小显示 不好看，那么就需要显示原大小 ，但是 新浪微博没有提供单个图片缓存的接口，需要我们自己去判断，对于远程服务器上的图片 ，客户端无法知道大小，因此要实现单图的效果  ，需要先把图片缓存到本地
    class func cacheStatusPictures(statuses: [TSZHomeMircoblogModel] ,finished: (datalist: [TSZHomeMircoblogModel]? , error: NSError?) ->()) {
        
        var dataLength = 0
        let group = dispatch_group_create()  //返回值是 dispatch_group_t
        for mrico  in statuses {
            guard let urls = mrico.pictureURLs  else{
                continue
            }
            for url in urls {
                dispatch_group_enter(group)
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, _, _, _, _) -> Void in
                    
                    if image != nil {
                        let data = UIImagePNGRepresentation(image)!
                        dataLength += data.length
                    }
                   
                    dispatch_group_leave(group)
                })
            }
        }
        //缓存完成之后，更新整个调度组的信息
        dispatch_group_notify(group,dispatch_get_main_queue()) { () -> Void in
            print("预加载图片的尺寸\(dataLength/1024) K")
            
            finished(datalist: statuses, error: nil)
        }
    }
    
    //MARK - 构造函数
    init(dict: [String : AnyObject]){
        super.init()
        //进行转模型
        setValuesForKeysWithDictionary(dict)
    }
    
    //在这里我们需要重写字典转模型的setV  forkey的方法
    override func setValue(value: AnyObject?, forKey key: String) {
        //根据是不是user ，如果是这个数组重新转
        if key == "user"{
            //判断一个有效的value
            if let dict = value as? [String :AnyObject]{
                //创建用户的数据 ，自己去进行装模型
                user = TSZUSerModel(dict: dict)
            }
            return
        }
        //判断ey是否是 retweeted_status ，就是转发的微博
        if key == "retweeted_status"{
            if let dict = value as? [String : AnyObject]{
                retweeted_status = TSZHomeMircoblogModel(dict: dict)
            }
            
            return
        }
        super.setValue(value, forKey: key)
    }
    //运行是完成
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    override var description: String {
        let keys = ["created_at", "id", "text", "source", "pic_urls","user"]
        
        return "\(dictionaryWithValuesForKeys(keys))"
    }
}
